package agenda;

import java.awt.Image;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

import javax.swing.ImageIcon;

public class Agenda {
	protected static List<Evento> Eventos;
	protected static List<Contato> Contatos;
	protected static Usuario Usuario;

	public static void main(String[] args) throws Exception {
		if (new File("eventos.dat").exists()) {
			Eventos = Agenda.CarregarEventos();
		} else {
			Eventos = new ArrayList<Evento>();
		}
		if (new File("contatos.dat").exists()) {
			Contatos = Agenda.CarregarContatos();
		} else {
			Contatos = new ArrayList<Contato>();
		}
		if (new File("Usuario.dat").exists()) {
			Usuario = Agenda.CarregarUsuario();
		} else {
			Usuario = new Usuario("", "", "", "", "", "  /  /   ",
					null);
			Usuario.setFotoUsuairo(new javax.swing.ImageIcon(Usuario.getClass().getResource("/agenda/sem_foto.gif")));
		}
		new JanelaInicial().setVisible(true);
	}

	/**
	 * Carrega os Eventos da Agenda a partir do arquivo evendos.dat
	 * 
	 * @return ArrayList dos Eventos da Agenda
	 * 
	 */
	public static List<Evento> CarregarEventos() {
		try {
			List<Evento> Eventos = (List) Arquivos.recuperarObjeto(new File(
					"eventos.dat"));
			return Eventos;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return null;
	}

	/**
	 * Carrega os dados do Úsuario
	 * 
	 * @return Úsuario
	 */
	public static Usuario CarregarUsuario() {
		try {
			Usuario Usuario = (Usuario) Arquivos.recuperarObjeto(new File(
					"Usuario.dat"));
			return Usuario;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return null;
	}

	/**
	 * Carrega os Contatos da Agenda
	 * 
	 * @return
	 */
	public static List<Contato> CarregarContatos() {
		try {
			List<Contato> Contatos = (List) Arquivos.recuperarObjeto(new File(
					"contatos.dat"));
			return Contatos;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return null;
	}

	/**
	 * Procura Contatos pelo Nome
	 * 
	 * @param Nome
	 *            Nome do contato procurado
	 */
	public static Contato ProcurarContato() {
		Contato contato = null;
		System.out.println("Digite o nome do Contato que está procurando:");
		Scanner Sc = new Scanner(System.in);
		String Nome = Sc.nextLine();
		Iterator<Contato> it = Contatos.iterator();
		while (it.hasNext()) {
			contato = it.next();
			if (contato.getNome().contains(Nome)) {
				System.out
						.println("É esse o contato que você está procurando ? "
								+ contato.getNome() + " sim ou não ?");
				if (Sc.nextLine().equals("sim")) {
					return contato;
				}
			}
		}
		System.out.println("Contato não encontrado");
		return contato;
	}

	static boolean ChecaChoquedeEventos(Evento Evento) throws Exception {
		Scanner sc = new Scanner(System.in);
		int diaNovoEvento = Integer.parseInt(Evento.getData().substring(0, 2));
		int mesNovoEvento = Integer.parseInt(Evento.getData().substring(3, 5));
		int anoNovoEvento = Integer.parseInt(Evento.getData().substring(6, 10));
		int horarioNovoEvento = Integer.parseInt(Evento.getHorario().substring(
				0, 2))
				* 60 + Integer.parseInt(Evento.getHorario().substring(0, 2));
		Iterator<Evento> it = Eventos.iterator();
		while (it.hasNext()) {
			Evento evento = it.next();
			int dia = Integer.parseInt(evento.getData().substring(0, 2));
			int mes = Integer.parseInt(evento.getData().substring(3, 5));
			int ano = Integer.parseInt(evento.getData().substring(6, 10));
			int horario = Integer.parseInt(evento.getHorario().substring(0, 2))
					* 60
					+ Integer.parseInt(evento.getHorario().substring(0, 2));
			int horariodeTermino = horario
					+ Integer.parseInt(evento.getHorario().substring(0, 2))
					* 60
					+ Integer.parseInt(evento.getHorario().substring(3, 5));
			if (dia == diaNovoEvento && mes == mesNovoEvento
					&& ano == anoNovoEvento) {
				if (horario <= horarioNovoEvento
						&& horarioNovoEvento < horariodeTermino) {
						return false;
					
				}
			}
			if (horariodeTermino > 1440) {
				dia += 1;
				if (dia + 1 > 31) {
					mes += 1;
					dia = 1;
					if (mes > 12) {
						ano += 1;
						mes = 1;
						if (dia == diaNovoEvento && mes == mesNovoEvento
								&& ano == anoNovoEvento) {
							if (horario <= horarioNovoEvento
									&& horarioNovoEvento < horariodeTermino) {
									return false;
							}
						}
					}
				}
			}
		}
		return true;
	}

	/**
	 * Lista os eventos em passados, em andamento e futuros
	 */
	private static void ListaEventos() throws Exception {
		String Passados = "Passados :";
		String Futuros = "Futuros :";
		String EmAndamento = "Em andamento :";
		Date calendar = new Date();
		Calendar calendar2 = new GregorianCalendar();
		Iterator<Evento> it = Eventos.iterator();
		while (it.hasNext()) {
			Evento evento = it.next();
			int dia = Integer.parseInt(evento.getData().substring(0, 2));
			int mes = Integer.parseInt(evento.getData().substring(3, 5));
			int ano = Integer.parseInt(evento.getData().substring(6, 10));
			int horario = Integer.parseInt(evento.getHorario().substring(0, 2))
					* 60
					+ Integer.parseInt(evento.getHorario().substring(0, 2));
			int duracao = Integer.parseInt(evento.getHorario().substring(0, 2))
					* 60
					+ Integer.parseInt(evento.getHorario().substring(3, 5));
			if (ano < calendar2.get(GregorianCalendar.YEAR)) {
				Passados += "\n" + evento.getNome();
			}
			if (ano == calendar2.get(GregorianCalendar.YEAR)) {
				if (mes < calendar2.get(GregorianCalendar.MONTH) + 1) {
					Passados += "\n" + evento.getNome();
					continue;
				}
				if (mes > calendar2.get(GregorianCalendar.MONTH) + 1) {
					Futuros += "\n" + evento.getNome();
					continue;
				}
				if (mes == calendar2.get(GregorianCalendar.MONTH) + 1) {
					if (dia < calendar.getDate()) {
						Passados += "\n" + evento.getNome();
						continue;
					}
					if (dia > calendar.getDate()) {
						Futuros += "\n" + evento.getNome();
						continue;
					}
					if (dia == calendar.getDate()) {
						if (horario <= calendar.getHours() * 60
								+ calendar.getMinutes()
								&& horario + duracao >= calendar.getHours()
										* 60 + calendar.getMinutes()) {
							EmAndamento += "\n" + evento.getNome();
							continue;
						}
						if (horario + duracao < calendar.getHours() * 60
								+ calendar.getMinutes()) {
							Passados += "\n" + evento.getNome();
							continue;
						}
						if (horario + duracao > calendar.getHours() * 60
								+ calendar.getMinutes()) {
							Futuros += "\n" + evento.getNome();
							continue;
						}
					}
				}
			}
			if (ano > calendar2.get(GregorianCalendar.YEAR)) {
				Futuros += "\n" + evento.getNome();
			}
		}
		System.out.println("Lista de Eventos\n -------- \n" + Passados + "\n"
				+ EmAndamento + "\n" + Futuros);
	}

}